interface Item {
  name: string;
}
// DataManager 函数要求的泛型是 T ， T 继承了 Item 接口，要求必须要有 name 为 string 类型的属性
class DataManager<T extends Item> {
  constructor(private data: T[]) {}
  getItem(index: number): string {
    return this.data[index].name;
  }
}

const data1 = new DataManager([
  {
    name: 'dell'
  }
]);

// 要求 DataManager2 的泛型必须要继承 number 或 string 的类型
class DataManager2<T extends number | string> {
  constructor(private data: T[]) {}
  getItem(index: number): T {
    return this.data[index];
  }
}

const data2 = new DataManager2<number>([1]);
data2.getItem(0);



interface Test {
  name: string;
}

const data = new DataManager2<number>([]);

// 如何使用泛型作为一个具体的类型注解
// 以下两种表达形式是一个意思
function hello<T>(params: T) {
  return params;
}

const func: <T>(param: T) => T = hello;
